/*
Copyright SecureKey Technologies Inc. All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/
package ichain

import (
	cb "git.cloud.inspur.com/ichain/ichain-protos-go/common"
	pb "git.cloud.inspur.com/ichain/ichain-protos-go/inode"
)

// BlockEvent 区块事件
type BlockEvent struct {
	Block     *cb.Block
	SourceURL string
}

// FilteredBlockEvent 返回部分区块信息
type FilteredBlockEvent struct {
	FilteredBlock *pb.FilteredBlock
	SourceURL     string
}

// TxStatusEvent 交易状态事件
type TxStatusEvent struct {
	TxID             string              // 交易id
	TxValidationCode pb.TxValidationCode // 交易状态码
	BlockNumber      uint64              // 区块号
	SourceURL        string
}

// ContractEvent 合约事件
type ContractEvent struct {
	TxID        string // 交易id
	ContractID  string // 合约id
	EventName   string // 事件名称
	Payload     []byte // 合约负载
	BlockNumber uint64 // 区块号
	SourceURL   string
}

// Registration 注册对象
type Registration interface{}

type BlockFilter func(block *cb.Block) bool

// EventService
// @Description:事件订阅服务接口
type EventService interface {
	// RegisterBlockEvent 区块事件订阅 返回全部区块信息
	RegisterBlockEvent(filter ...BlockFilter) (Registration, <-chan *BlockEvent, error)
	// RegisterFilteredBlockEvent 区块订阅事件 返回部分区块信息
	RegisterFilteredBlockEvent() (Registration, <-chan *FilteredBlockEvent, error)
	// RegisterContractEvent 订阅合约事件
	RegisterContractEvent(ccID, eventFilter string) (Registration, <-chan *ContractEvent, error)
	// RegisterTxStatusEvent 订阅交易状态变化事件
	RegisterTxStatusEvent(txID string) (Registration, <-chan *TxStatusEvent, error)
	// Unregister 取消订阅
	Unregister(reg Registration)
}

// EventClient 事件订阅客户端接口
type EventClient interface {
	EventService       // 事件订阅客户端实现事件服务接口 允许注册订阅
	Connect() error    // 连接事件服务
	Close()            // 关闭连接
	CloseIfIdle() bool // 空闲则关闭连接
}
